<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>
<body>

</body>
</html>

<script>
// 继承 ->
  // 
/* 面试问题：JS中 如何实现 继承？
  首先，继承的目的都是为了 代码的复用；JS中用 原型链 的技术实现继承。
  1）任意的构造函数(也可以叫 类)，构造函数.prototype 其指向原型对象，该原型对象.__proto__ 默认指向 Object.prototype
    这种默认的形式，使得 任意对象都继承了  Object.prototype 上的方法，这就是一种继承的体现。、
  2）若任意的构造函数/类，想继承 其他类/构造函数的方法和属性(管他可以叫 父类/基类)，
    1- ES6提供的子类继承父类的办法是： `class 子类名 extends 父类名`
    2- 本质：
      - 子类.prototype = new 父类(); 可以让子类的实例拿到 父类的 方法； -> 原型继承
        -> 还需要： 子类.prototype.constructor = 子类;
      - 子类构造函数中 { 父类.call(this, 实例属性...) }  -实现 子类复用父类中 属性的代码； -> 借用继承
*/

// 动物类
class Animal {
  constructor(height, weight) {
    this.height = height;
    this.weight = weight;
  }

  run() {
    console.log('run....');
  }
}

// 工人类

// 1. extends 实现了  原型继承； 即 Worker 实例 可以拿到 Animal 的方法
class Worker extends Animal {
  constructor(name, className, age, height, weight) {
    super(height, weight) // 2. super 实现了 借用继承； 注： super 必须在 函数体 的第一行
    this.name = name;
    this.className = className;
    this.age = age;
  }

  work() {
    console.log('工作 durang durang...');
  }
}

const zhang = new Worker('老张', '油漆工', 33, '170cm', '70kg');

console.log(zhang);

</script>